
import { useEditorStore } from "@/stores/editStore"
import { storeToRefs } from "pinia"

export const loadHeadings = () => {
  const editorStore = useEditorStore()
  const { editorInstance } = storeToRefs(editorStore)
  const headings = [] as any[]

  if (!editorInstance.value) return
  //获取事务？
  const transaction = editorInstance.value.state.tr
  
  if (!transaction) return
  editorInstance.value?.state.doc.descendants((node: any, pos: any) => {
    if (node.type.name === 'heading') {
      // console.log("标签位置：",pos, node.attrs.level, node.textContent)
      const start = pos
      const end = pos + node.content.size
      // const end = pos + node
      //这个id是拿来干嘛？做锚点跳转？
      const id = `heading-${headings.length + 1}`
      if (node.attrs.id !== id) {
        transaction.setNodeMarkup(pos, undefined, {
          ...node.attrs,
          id
        })
      }
      const nodeInfo = {
        level: node.attrs.level,
        text: node.textContent,
        start,
        end,
        id,
        children: []
      }
      let indexInsert = 0; //全局变量定义 插入的下标位置
      //如果是headers是空，直接push
      if(headings.length === 0) {
        //一级标题直接添加到数组
        headings.push(nodeInfo);
      } else {
        // 非一级标题，for循环寻找父级标题 但是还是有1级标题后，直接是3级标题
        // 如果标题层级不连续，可能需要更复杂的逻辑来处理，不能是连续的,还需要判断是哪个一级标题下面的子标题。
        // 例如：1级标题后直接是3级标题，这种直接成为顶层标题的子标题
        // 还是需要判断headings数组里面有没有元素，如果没有，则直接添加
        if(nodeInfo.level === 1) {
          //如果里面有元素，且插入的标题是1级标题，则直接添加到数组
          headings.push(nodeInfo);
        }else{
          //获取数组最后一个元素，往里添加对应的数据(但是这个数据里面可能还有数据？)
          let lastHeadingChildren = headings[headings.length - 1].children;
          // headings[headings.length - 1].children.push(nodeInfo);
          //递归判断里面元素如果为0，同级直接push，
          while (lastHeadingChildren.length !== 0) {
            //同时，leavel大于等于当前标题的level，说明是同级标题 或者高一级 132的等级情况
            if (lastHeadingChildren[lastHeadingChildren.length-1].level >= nodeInfo.level) {
              // 如果是同级标题，直接push
              break;
            }
            //否则继续往里递归
            lastHeadingChildren = lastHeadingChildren[lastHeadingChildren.length - 1].children;
          }
          lastHeadingChildren.push(nodeInfo);
        }
      }
    }
  })
  transaction?.setMeta('addToHistory', false)
  transaction?.setMeta('preventUpdate', true)
  editorInstance.value.view.dispatch(transaction);
  // editor.value?.view.dispatch(transaction)
  editorStore.setHeadings(headings)
}



